home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / marvins.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  28KB  |  870 lines

  1. /*
  2. various early SNK games (1983-1985)
  3. - Marvin's Maze
  4. - Vanguard II
  5. - Mad Crasher
  6.  
  7. driver by Phil Stroffolino
  8.  
  9. Known Issues:
  10.     Mad Crasher sound effects aren't being played
  11.     Vanguard II crashes under dos with sound enabled
  12.     Marvin's maze crashes under dos with sound enabled, hangs with sound
  13. disabled
  14. */
  15.  
  16. #include "driver.h"
  17. #include "vidhrdw/generic.h"
  18. #include "cpu/z80/z80.h"
  19.  
  20. WRITE_HANDLER( snkwave_w );
  21.  
  22. #define CREDITS "Phil Stroffolino\nTim Lindquist\nCarlos A. Lozano"
  23.  
  24. /***************************************************************************
  25. **
  26. **    CPUA and CPUB communicate through shared RAM.
  27. **
  28. ***************************************************************************/
  29.  
  30. READ_HANDLER( marvins_background_ram_r );
  31. WRITE_HANDLER( marvins_background_ram_w );
  32.  
  33. READ_HANDLER( marvins_foreground_ram_r );
  34. WRITE_HANDLER( marvins_foreground_ram_w );
  35.  
  36. READ_HANDLER( marvins_text_ram_r );
  37. WRITE_HANDLER( marvins_text_ram_w );
  38.  
  39. READ_HANDLER( marvins_spriteram_r );
  40. WRITE_HANDLER( marvins_spriteram_w );
  41.  
  42. /***************************************************************************
  43. **
  44. ** Video Driver
  45. **
  46. ***************************************************************************/
  47.  
  48. extern int marvins_vh_start( void );
  49. extern void marvins_vh_screenrefresh( struct osd_bitmap *bitmap, int fullrefresh );
  50. extern void madcrash_vh_screenrefresh( struct osd_bitmap *bitmap, int fullrefresh );
  51. WRITE_HANDLER( marvins_palette_bank_w );
  52.  
  53. /***************************************************************************
  54. **
  55. **    Sound System
  56. **
  57. **    The sound CPU is a slave, with communication.
  58. **
  59. **    Sound Chips: PSGX2 + "Wave Generater"
  60. **
  61. **    The Custom Wave Generator is controlled by 6 bytes
  62. **
  63. **    The first pair of registers (0x8002, 0x8003) appear to define frequency
  64. **    as a fraction: RAM[0x8003]/RAM[0x8002].
  65. **
  66. **    (0x8004, 0x8005, 0x8006, 0x8007) are currently unmapped.  Probably they
  67. **    control the shape of the wave being played.
  68. **
  69. **    snkwave_interface is currently implemented with the "namco" sound component.
  70. **
  71. ***************************************************************************/
  72.  
  73. static int sound_cpu_busy_bit;
  74. static int sound_cpu_ready;
  75. static int sound_command;
  76. static int sound_fetched;
  77.  
  78. static struct namco_interface snkwave_interface =
  79. {
  80.     23920,    /* ? (wave generator has a 8Mhz clock near it) */
  81.     1,        /* number of voices */
  82.     8,        /* playback volume */
  83.     -1        /* memory region */
  84. };
  85.  
  86. static struct AY8910interface ay8910_interface =
  87. {
  88.     2, /* number of chips */
  89.     2000000, /* 2 MHz */
  90.     { 35,35 },
  91.     { 0 },
  92.     { 0 },
  93.     { 0 },
  94.     { 0 }
  95. };
  96.  
  97. static void init_sound( int busy_bit ){
  98.     sound_cpu_busy_bit = busy_bit;
  99.     sound_cpu_ready = 1;
  100.     sound_command = 0x00;
  101.     sound_fetched = 1;
  102. }
  103.  
  104. static WRITE_HANDLER( sound_command_w ){
  105.     if( sound_fetched==0 ){
  106.         logerror("missed sound command: %02x\n", sound_command );
  107.     }
  108.  
  109.     sound_fetched = 0;
  110.     sound_command = data;
  111.     sound_cpu_ready = 0;
  112.     cpu_cause_interrupt( 2, Z80_IRQ_INT );
  113. }
  114.  
  115. static READ_HANDLER( sound_command_r ){
  116.     sound_fetched = 1;
  117.     return sound_command;
  118. }
  119.  
  120. static READ_HANDLER( sound_ack_r ){
  121.     sound_cpu_ready = 1;
  122.     return 0xff;
  123. }
  124.  
  125. static struct MemoryReadAddress readmem_sound[] = {
  126.     { 0x0000, 0x3fff, MRA_ROM },
  127.     { 0x4000, 0x4000, sound_command_r },
  128.     { 0xa000, 0xa000, sound_ack_r },
  129.     { 0xe000, 0xe7ff, MRA_RAM },
  130.     { -1 }
  131. };
  132.  
  133. static struct MemoryWriteAddress writemem_sound[] = {
  134.     { 0x0000, 0x3fff, MWA_ROM, &namco_wavedata },    /* silly hack - this shouldn't be here */
  135.     { 0x8000, 0x8000, AY8910_control_port_0_w },
  136.     { 0x8001, 0x8001, AY8910_write_port_0_w },
  137.     { 0x8002, 0x8007, snkwave_w },
  138.     { 0x8008, 0x8008, AY8910_control_port_1_w },
  139.     { 0x8009, 0x8009, AY8910_write_port_1_w },
  140.     { 0xe000, 0xe7ff, MWA_RAM },
  141.     { -1 }
  142. };
  143.  
  144. /* this input port has one of its bits mapped to sound CPU status */
  145. static READ_HANDLER( marvins_port_0_r ){
  146.     int result = input_port_0_r( 0 );
  147.     if( !sound_cpu_ready ) result |= sound_cpu_busy_bit;
  148.     return result;
  149. }
  150.  
  151. /***************************************************************************
  152. **
  153. **    Game Specific Initialization
  154. **
  155. **    madcrash_vreg defines an offset for the video registers which is
  156. **    different in Mad Crasher and Vanguard II.
  157. **
  158. **    init_sound defines the location of the polled sound CPU busy bit,
  159. **    which also varies across games.
  160. **
  161. ***************************************************************************/
  162.  
  163. int madcrash_vreg;
  164.  
  165.  
  166. /***************************************************************************
  167. **
  168. **    Interrupt Handling
  169. **
  170. **    CPUA can trigger an interrupt on CPUB, and CPUB can trigger an interrupt
  171. **    on CPUA.  Each CPU must re-enable interrupts on itself.
  172. **
  173. ***************************************************************************/
  174.  
  175. #define SNK_NMI_ENABLE    1
  176. #define SNK_NMI_PENDING    2
  177. static int CPUA_latch = 0;
  178. static int CPUB_latch = 0;
  179.  
  180. static WRITE_HANDLER( CPUA_int_enable_w )
  181. {
  182.     if( CPUA_latch & SNK_NMI_PENDING )
  183.     {
  184.         cpu_cause_interrupt( 0, Z80_NMI_INT );
  185.         CPUA_latch = 0;
  186.     }
  187.     else
  188.     {
  189.         CPUA_latch |= SNK_NMI_ENABLE;
  190.     }
  191. }
  192.  
  193. static READ_HANDLER( CPUA_int_trigger_r )
  194. {
  195.     if( CPUA_latch&SNK_NMI_ENABLE )
  196.     {
  197.         cpu_cause_interrupt( 0, Z80_NMI_INT );
  198.         CPUA_latch = 0;
  199.     }
  200.     else
  201.     {
  202.         CPUA_latch |= SNK_NMI_PENDING;
  203.     }
  204.     return 0xff;
  205. }
  206.  
  207. static WRITE_HANDLER( CPUB_int_enable_w )
  208. {
  209.     if( CPUB_latch & SNK_NMI_PENDING )
  210.     {
  211.         cpu_cause_interrupt( 1, Z80_NMI_INT );
  212.         CPUB_latch = 0;
  213.     }
  214.     else
  215.     {
  216.         CPUB_latch |= SNK_NMI_ENABLE;
  217.     }
  218. }
  219.  
  220. static READ_HANDLER( CPUB_int_trigger_r )
  221. {
  222.     if( CPUB_latch&SNK_NMI_ENABLE )
  223.     {
  224.         cpu_cause_interrupt( 1, Z80_NMI_INT );
  225.         CPUB_latch = 0;
  226.     }
  227.     else
  228.     {
  229.         CPUB_latch |= SNK_NMI_PENDING;
  230.     }
  231.     return 0xff;
  232. }
  233.  
  234. /***************************************************************************
  235. **
  236. **    Memory Maps for CPUA, CPUB
  237. **
  238. **    Shared RAM is shuffled in Mad Crasher/Vanguard II compared to
  239. **    Marvin's Maze.
  240. **
  241. **    A few ports are mapped differently for each game.
  242. **
  243. ***************************************************************************/
  244.  
  245. static struct MemoryReadAddress readmem_CPUA[] =
  246. {
  247.     { 0x0000, 0x7fff, MRA_ROM },
  248.     { 0x8000, 0x8000, marvins_port_0_r },    /* coin input, start, sound CPU status */
  249.     { 0x8100, 0x8100, input_port_1_r },        /* player #1 controls */
  250.     { 0x8200, 0x8200, input_port_2_r },        /* player #2 controls */
  251.     { 0x8400, 0x8400, input_port_3_r },        /* dipswitch#1 */
  252.     { 0x8500, 0x8500, input_port_4_r },        /* dipswitch#2 */
  253.     { 0x8700, 0x8700, CPUB_int_trigger_r },
  254.     { 0xc000, 0xcfff, MRA_RAM },
  255.     { 0xd000, 0xffff, MRA_RAM },
  256.     { -1 }
  257. };
  258.  
  259. static struct MemoryWriteAddress writemem_CPUA[] =
  260. {
  261.     { 0x6000, 0x6000, marvins_palette_bank_w }, // Marvin's Maze only
  262.     { 0x0000, 0x7fff, MWA_ROM },
  263.     { 0x8300, 0x8300, sound_command_w },
  264.     { 0x8600, 0x8600, MWA_RAM },
  265.     { 0x86f1, 0x86f1, MWA_RAM },
  266.     { 0x8700, 0x8700, CPUA_int_enable_w },
  267.     { 0xc000, 0xcfff, MWA_RAM, &spriteram },
  268.     { 0xd000, 0xd7ff, marvins_background_ram_w, &videoram },
  269.     { 0xd800, 0xdfff, MWA_RAM },
  270.     { 0xe000, 0xe7ff, marvins_foreground_ram_w },
  271.     { 0xe800, 0xefff, MWA_RAM },
  272.     { 0xf000, 0xf3ff, marvins_text_ram_w },
  273.     { 0xf400, 0xffff, MWA_RAM },
  274.     { -1 }
  275. };
  276.  
  277. static struct MemoryReadAddress marvins_readmem_CPUB[] =
  278. {
  279.     { 0x0000, 0x7fff, MRA_ROM },
  280.     { 0x8700, 0x8700, CPUA_int_trigger_r },
  281.     { 0xc000, 0xcfff, marvins_spriteram_r },
  282.     { 0xd000, 0xffff, marvins_background_ram_r },
  283.     { 0xe000, 0xffff, marvins_foreground_ram_r },
  284.     { 0xf000, 0xffff, marvins_text_ram_r },
  285.     { -1 }
  286. };
  287.  
  288. static struct MemoryWriteAddress marvins_writemem_CPUB[] =
  289. {
  290.     { 0x0000, 0x7fff, MWA_ROM },
  291.     { 0x8700, 0x8700, CPUB_int_enable_w },
  292.     { 0xc000, 0xcfff, marvins_spriteram_w },
  293.     { 0xd000, 0xffff, marvins_background_ram_w },
  294.     { 0xe000, 0xffff, marvins_foreground_ram_w },
  295.     { 0xf000, 0xffff, marvins_text_ram_w },
  296.     { -1 }
  297. };
  298.  
  299. static struct MemoryReadAddress madcrash_readmem_CPUB[] =
  300. {
  301.     { 0x0000, 0x9fff, MRA_ROM },
  302.     { 0xc000, 0xcfff, marvins_foreground_ram_r },
  303.     { 0xd000, 0xdfff, marvins_text_ram_r },
  304.     { 0xe000, 0xefff, marvins_spriteram_r },
  305.     { 0xf000, 0xffff, marvins_background_ram_r },
  306.     { -1 }
  307. };
  308.  
  309. static struct MemoryWriteAddress madcrash_writemem_CPUB[] =
  310. {
  311.     { 0x0000, 0x7fff, MWA_ROM },
  312.     { 0x8700, 0x8700, CPUB_int_enable_w }, /* Vangaurd II */
  313.     { 0x8000, 0x9fff, MWA_ROM }, /* extra ROM for Mad Crasher */
  314.     { 0xa000, 0xa000, CPUB_int_enable_w }, /* Mad Crasher */
  315.     { 0xc000, 0xcfff, marvins_foreground_ram_w },
  316.     { 0xd000, 0xdfff, marvins_text_ram_w },
  317.     { 0xe000, 0xefff, marvins_spriteram_w },
  318.     { 0xf000, 0xffff, marvins_background_ram_w },
  319.     { -1 }
  320. };
  321.  
  322.  
  323.  
  324. INPUT_PORTS_START( marvins )
  325.     PORT_START
  326.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  327.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  328.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 )
  329.     PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_START1 )
  330.     PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_START2 )
  331.     PORT_BIT( 0x20, IP_ACTIVE_LOW,  IPT_UNKNOWN )
  332.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
  333.     PORT_BIT( 0x80, IP_ACTIVE_LOW,  IPT_UNKNOWN )
  334.  
  335.     PORT_START /* player#1 controls */
  336.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
  337.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  338.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  339.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  340.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
  341.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
  342.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  343.  
  344.     PORT_START /* player#2 controls */
  345.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
  346.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
  347.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
  348.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  349.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
  350.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
  351.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  352.  
  353.     PORT_START    /* DSW1 */
  354.     PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
  355.     PORT_DIPSETTING(    0x00, "1" )
  356.     PORT_DIPSETTING(    0x01, "2" )
  357.     PORT_DIPSETTING(    0x02, "3" )
  358.     PORT_DIPSETTING(    0x03, "5" )
  359.     PORT_BITX(0x04,     0x04, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Infinite Lives", IP_JOY_NONE, IP_KEY_NONE )
  360.     PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
  361.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  362.     PORT_DIPNAME( 0x38, 0x00, DEF_STR( Coinage ) )
  363.     PORT_DIPSETTING(    0x38, DEF_STR( 5C_1C ) )
  364.     PORT_DIPSETTING(    0x30, DEF_STR( 3C_1C ) )
  365.     PORT_DIPSETTING(    0x28, DEF_STR( 2C_1C ) )
  366.     PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
  367.     PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
  368.     PORT_DIPSETTING(    0x10, DEF_STR( 1C_3C ) )
  369.     PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
  370.     PORT_DIPSETTING(    0x20, DEF_STR( 1C_6C ) )
  371.     PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) )
  372.     PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
  373.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  374.     PORT_DIPNAME( 0x80, 0x80, "Freeze" )
  375.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  376.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  377.  
  378.     PORT_START    /* DSW2 (unverified) */
  379.     PORT_DIPNAME( 0x07, 0x07, "1st Bonus Life" )
  380.     PORT_DIPSETTING(    0x07, "10000" )
  381.     PORT_DIPSETTING(    0x06, "20000" )
  382.     PORT_DIPSETTING(    0x05, "30000" )
  383.     PORT_DIPSETTING(    0x04, "40000" )
  384.     PORT_DIPSETTING(    0x03, "50000" )
  385.     PORT_DIPSETTING(    0x02, "60000" )
  386.     PORT_DIPSETTING(    0x01, "70000" )
  387.     PORT_DIPSETTING(    0x00, "80000" )
  388.     PORT_DIPNAME( 0x18, 0x18, "2nd Bonus Life" )
  389.     PORT_DIPSETTING(    0x10, "1st bonus*2" )
  390.     PORT_DIPSETTING(    0x08, "1st bonus*3" )
  391.     PORT_DIPSETTING(    0x00, "1st bonus*4" )
  392. //    PORT_DIPSETTING(    0x18, "Unused" )
  393.     PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
  394.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  395.     PORT_DIPSETTING(    0x20, DEF_STR( On ) )
  396.     PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
  397.     PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
  398.     PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
  399.     PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )
  400.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  401.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  402. INPUT_PORTS_END
  403.  
  404.  
  405. INPUT_PORTS_START( vangrd2 )
  406.     PORT_START
  407.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
  408.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  409.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  410.     PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_START1 )
  411.     PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_START2 )
  412.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
  413.     PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_UNKNOWN )
  414.     PORT_BIT( 0x80, IP_ACTIVE_LOW,  IPT_UNKNOWN )
  415.  
  416.     PORT_START /* player#1 controls */
  417.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
  418.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  419.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  420.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  421.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 )
  422.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
  423.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  424.  
  425.     PORT_START /* player#2 controls */
  426.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
  427.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
  428.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
  429.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  430.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
  431.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
  432.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  433.  
  434.     PORT_START    /* DSW1 */
  435.     PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
  436.     PORT_DIPSETTING(    0x00, DEF_STR( 6C_1C ) )
  437.     PORT_DIPSETTING(    0x01, DEF_STR( 5C_1C ) )
  438.     PORT_DIPSETTING(    0x02, DEF_STR( 3C_1C ) )
  439.     PORT_DIPSETTING(    0x03, DEF_STR( 2C_1C ) )
  440.     PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
  441.     PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
  442.     PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
  443.     PORT_DIPSETTING(    0x04, DEF_STR( 1C_5C ) )
  444.     PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds) )
  445.     PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
  446.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  447.     PORT_DIPNAME( 0x10, 0x10, "Unknown" ) // difficulty?
  448.     PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
  449.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  450.     PORT_DIPNAME( 0x20, 0x20, "Unknown" )
  451.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  452.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  453.     PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Lives ) )
  454.     PORT_DIPSETTING(    0x00, "1" )
  455.     PORT_DIPSETTING(    0x40, "2" )
  456.     PORT_DIPSETTING(    0x80, "3" )
  457.     PORT_DIPSETTING(    0xc0, "5" )
  458.  
  459.     PORT_START    /* DSW2 */
  460.     PORT_DIPNAME( 0x01, 0x01, DEF_STR( Demo_Sounds) )
  461.     PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
  462.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  463.     PORT_DIPNAME( 0x02, 0x02, "Freeze" )
  464.     PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
  465.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  466.     PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) )
  467.     PORT_DIPSETTING(    0x04, DEF_STR( Upright ) )
  468.     PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
  469.     PORT_DIPNAME( 0x08, 0x08, "Language" )
  470.     PORT_DIPSETTING(    0x08, "English" )
  471.     PORT_DIPSETTING(    0x00, "Japanese" )
  472.     PORT_DIPNAME( 0x10, 0x10, "Unknown" )
  473.     PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
  474.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  475.     PORT_BITX(0x20,     0x20, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Infinite Lives", IP_JOY_NONE, IP_KEY_NONE )
  476.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  477.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  478.     PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) )
  479.     PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
  480.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  481.     PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )
  482.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  483.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  484. INPUT_PORTS_END
  485.  
  486.  
  487. INPUT_PORTS_START( madcrash )
  488.     PORT_START
  489.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
  490.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
  491.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 )
  492.     PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_START1 )
  493.     PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_START2 )
  494.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
  495.     PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_UNKNOWN )
  496.     PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
  497.  
  498.     PORT_START /* player#1 controls */
  499.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
  500.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  501.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  502.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  503.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 )
  504.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
  505.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  506.  
  507.     PORT_START /* player#2 controls */
  508.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
  509.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
  510.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
  511.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  512.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
  513.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
  514.     PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
  515.  
  516.     PORT_START    /* DSW1 */
  517.     PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) )
  518.     PORT_DIPSETTING(    0x01, DEF_STR( Upright ) )
  519.     PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
  520.     PORT_DIPNAME( 0x02, 0x02, "Unknown" )
  521.     PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
  522.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  523.     PORT_DIPNAME( 0x04, 0x04, DEF_STR( Lives ) )
  524.     PORT_DIPSETTING(    0x04, "3" )
  525.     PORT_DIPSETTING(    0x00, "5" )
  526.     PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coinage ) )
  527. //    PORT_DIPSETTING(    0x08, DEF_STR( 5C_1C ) )
  528.     PORT_DIPSETTING(    0x10, DEF_STR( 5C_1C ) )
  529.     PORT_DIPSETTING(    0x20, DEF_STR( 3C_1C ) )
  530.     PORT_DIPSETTING(    0x18, DEF_STR( 2C_1C ) )
  531.     PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
  532.     PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
  533.     PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
  534.     PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
  535.     PORT_DIPNAME( 0xc0, 0xc0, "Bonus?" )
  536.     PORT_DIPSETTING(    0x00, "1" )
  537.     PORT_DIPSETTING(    0x40, "2" )
  538.     PORT_DIPSETTING(    0x80, "3" )
  539.     PORT_DIPSETTING(    0xc0, "4" )
  540.  
  541.     PORT_START    /* DSW2 */
  542.     PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
  543.     PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
  544.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  545.     PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
  546.     PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
  547.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  548.     PORT_DIPNAME( 0x04, 0x04, DEF_STR( Difficulty ) )
  549.     PORT_DIPSETTING(    0x04, "Easy" )
  550.     PORT_DIPSETTING(    0x00, "Hard" )
  551.     PORT_DIPNAME( 0x18, 0x10, "Game mode" )
  552.     PORT_DIPSETTING(    0x18, "Demo Sounds Off" )
  553.     PORT_DIPSETTING(    0x10, "Demo Sounds On" )
  554.     PORT_BITX(0,        0x08, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite Lives", IP_JOY_NONE, IP_KEY_NONE )
  555.     PORT_DIPSETTING(    0x00, "Freeze" )
  556.     PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) )
  557.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  558.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  559.     PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
  560.     PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
  561.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  562.     PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
  563.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  564.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  565. INPUT_PORTS_END
  566.  
  567.  
  568.  
  569. /***************************************************************************
  570. **
  571. **    Graphics Layout
  572. **
  573. ***************************************************************************/
  574.  
  575. static struct GfxLayout sprite_layout =
  576. {
  577.     16,16,
  578.     0x100,
  579.     3,
  580.     { 0,0x2000*8,0x4000*8 },
  581.     {
  582.         7,6,5,4,3,2,1,0,
  583.         15,14,13,12,11,10,9,8
  584.     },
  585.     {
  586.         0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
  587.         8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16
  588.     },
  589.     256
  590. };
  591.  
  592. static struct GfxLayout tile_layout =
  593. {
  594.     8,8,
  595.     0x100,
  596.     4,
  597.     { 0, 1, 2, 3 },
  598.     { 4, 0, 12, 8, 20, 16, 28, 24},
  599.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
  600.     256
  601. };
  602.  
  603. static struct GfxDecodeInfo marvins_gfxdecodeinfo[] =
  604. {
  605.     { REGION_GFX1, 0, &tile_layout,    0x080, 8  }, /* text layer */
  606.     { REGION_GFX2, 0, &tile_layout,    0x110, 1  }, /* background */
  607.     { REGION_GFX3, 0, &tile_layout,    0x100, 1  }, /* foreground */
  608.     { REGION_GFX4, 0, &sprite_layout,    0x000, 16 }, /* sprites */
  609.     { -1 }
  610. };
  611.  
  612. /***************************************************************************
  613. **
  614. **    Machine Driver
  615. **
  616. ***************************************************************************/
  617.  
  618. static struct MachineDriver machine_driver_marvins = {
  619.     {
  620.         {
  621.             CPU_Z80,
  622.             3360000,    /* 3.336 Mhz */
  623.             readmem_CPUA,writemem_CPUA,0,0,
  624.             interrupt,1
  625.         },
  626.         {
  627.             CPU_Z80,
  628.             3360000,    /* 3.336 Mhz */
  629.             marvins_readmem_CPUB,marvins_writemem_CPUB,0,0,
  630.             interrupt,1
  631.         },
  632.         {
  633.             CPU_Z80 | CPU_AUDIO_CPU,
  634.             4000000,    /* 4.0 Mhz */
  635.             readmem_sound,writemem_sound,0,0,
  636.             nmi_interrupt,4 /* seems to be correct */
  637.         },
  638.     },
  639.     60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
  640.     100, /* CPU slices per frame */
  641.     0, /* init_machine */
  642.  
  643.     /* video hardware */
  644.     256+32, 224, { 0, 255+32,0, 223 },
  645.     marvins_gfxdecodeinfo,
  646.     (16+2)*16,(16+2)*16,
  647.     0,
  648.  
  649.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  650.     0,
  651.     marvins_vh_start,
  652.     0,
  653.     marvins_vh_screenrefresh,
  654.  
  655.     /* sound hardware */
  656.     0,0,0,0,
  657.     {
  658.         {
  659.             SOUND_AY8910,
  660.             &ay8910_interface
  661.         },
  662.         {
  663.             SOUND_NAMCO,
  664.             &snkwave_interface
  665.         }
  666.     }
  667. };
  668.  
  669. static struct MachineDriver machine_driver_madcrash = {
  670.     {
  671.         {
  672.             CPU_Z80,
  673.             3360000,    /* 3.336 Mhz */
  674.             readmem_CPUA,writemem_CPUA,0,0,
  675.             interrupt,1
  676.         },
  677.         {
  678.             CPU_Z80,
  679.             3360000,    /* 3.336 Mhz */
  680.             madcrash_readmem_CPUB,madcrash_writemem_CPUB,0,0,
  681.             interrupt,1
  682.         },
  683.         {
  684.             CPU_Z80 | CPU_AUDIO_CPU,
  685.             4000000,    /* 4.0 Mhz */
  686.             readmem_sound,writemem_sound,0,0,
  687.             nmi_interrupt,4 /* wrong? */
  688.         },
  689.     },
  690.     60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
  691.     100,    /* CPU slices per frame */
  692.     0, /* init_machine */
  693.  
  694.     /* video hardware */
  695.     256+32, 224, { 0, 255+32,0, 223 },
  696.     marvins_gfxdecodeinfo,
  697.     (16+2)*16,(16+2)*16,
  698.     0,
  699.  
  700.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  701.     0,
  702.     marvins_vh_start,
  703.     0,
  704.     madcrash_vh_screenrefresh,
  705.  
  706.     /* sound hardware */
  707.     0,0,0,0,
  708.     {
  709.         {
  710.             SOUND_AY8910,
  711.             &ay8910_interface
  712.         },
  713.         {
  714.             SOUND_NAMCO,
  715.             &snkwave_interface
  716.         }
  717.     }
  718. };
  719.  
  720. /***************************************************************************
  721. **
  722. **    ROM Loading
  723. **
  724. **    note:
  725. **        Mad Crasher doesn't pass its internal checksum
  726. **        Also, some of the background graphics look to be incorrect.
  727. **
  728. ***************************************************************************/
  729.  
  730. ROM_START( marvins )
  731.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for CPUA code */
  732.     ROM_LOAD( "pa1",   0x0000, 0x2000, 0x0008d791 )
  733.     ROM_LOAD( "pa2",   0x2000, 0x2000, 0x9457003c )
  734.     ROM_LOAD( "pa3",   0x4000, 0x2000, 0x54c33ecb )
  735.  
  736.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for CPUB code */
  737.     ROM_LOAD( "pb1",   0x0000, 0x2000, 0x3b6941a5 )
  738.  
  739.     ROM_REGION( 0x10000, REGION_CPU3 )    /* 64k for sound code */
  740.     ROM_LOAD( "m1",    0x0000, 0x2000, 0x2314c696 )
  741.     ROM_LOAD( "m2",    0x2000, 0x2000, 0x74ba5799 )
  742.  
  743.     ROM_REGION( 0x2000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  744.     ROM_LOAD( "s1",    0x0000, 0x2000, 0x327f70f3 )    /* characters */
  745.  
  746.     ROM_REGION( 0x2000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  747.     ROM_LOAD( "b1",    0x0000, 0x2000, 0xe528bc60 )    /* background tiles */
  748.  
  749.     ROM_REGION( 0x2000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  750.     ROM_LOAD( "b2",    0x0000, 0x2000, 0xe528bc60 )    /* foreground tiles */
  751.  
  752.     ROM_REGION( 0x6000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  753.     ROM_LOAD( "f3",    0x0000, 0x2000, 0xe55c9b83 )    /* sprites */
  754.     ROM_LOAD( "f2",    0x2000, 0x2000, 0x8fc2b081 )
  755.     ROM_LOAD( "f1",    0x4000, 0x2000, 0x0bd6b4e5 )
  756.  
  757.     ROM_REGION( 0x0c00, REGION_PROMS )
  758.     ROM_LOAD( "marvmaze.j1",  0x000, 0x400, 0x92f5b06d )
  759.     ROM_LOAD( "marvmaze.j2",  0x400, 0x400, 0xd2b25665 )
  760.     ROM_LOAD( "marvmaze.j3",  0x800, 0x400, 0xdf9e6005 )
  761. ROM_END
  762.  
  763. ROM_START( madcrash )
  764.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for CPUA code */
  765.     ROM_LOAD( "p8",    0x0000, 0x2000, 0xecb2fdc9 )
  766.     ROM_LOAD( "p9",    0x2000, 0x2000, 0x0a87df26 )
  767.     ROM_LOAD( "p10",   0x4000, 0x2000, 0x6eb8a87c )
  768.  
  769.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for CPUB code */
  770.     ROM_LOAD( "p4",   0x0000, 0x2000, 0x5664d699 )
  771.     ROM_LOAD( "p5",   0x2000, 0x2000, 0xdea2865a )
  772.     ROM_LOAD( "p6",   0x4000, 0x2000, 0xe25a9b9c )
  773.     ROM_LOAD( "p7",   0x6000, 0x2000, 0x55b14a36 )
  774.     ROM_LOAD( "p3",   0x8000, 0x2000, 0xe3c8c2cb )
  775.  
  776.     ROM_REGION( 0x10000, REGION_CPU3 )    /* 64k for sound code */
  777.     ROM_LOAD( "p1",   0x0000, 0x2000, 0x2dcd036d )
  778.     ROM_LOAD( "p2",   0x2000, 0x2000, 0xcc30ae8b )
  779.  
  780.     ROM_REGION( 0x2000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  781.     ROM_LOAD( "p13",    0x0000, 0x2000, 0x48c4ade0 )    /* characters */
  782.  
  783.     ROM_REGION( 0x2000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  784.     ROM_LOAD( "p11",    0x0000, 0x2000, 0x67174956 )    /* background tiles */
  785.  
  786.     ROM_REGION( 0x2000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  787.     ROM_LOAD( "p12",    0x0000, 0x2000, 0x085094c1 )    /* foreground tiles */
  788.  
  789.     ROM_REGION( 0x6000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  790.     ROM_LOAD( "p14",    0x0000, 0x2000, 0x07e807bc )    /* sprites */
  791.     ROM_LOAD( "p15",    0x2000, 0x2000, 0xa74149d4 )
  792.     ROM_LOAD( "p16",    0x4000, 0x2000, 0x6153611a )
  793.  
  794.     ROM_REGION( 0x0c00, REGION_PROMS )
  795.     ROM_LOAD( "m3-prom.j3",  0x000, 0x400, 0xd19e8a91 )
  796.     ROM_LOAD( "m2-prom.j4",  0x400, 0x400, 0x9fc325af )
  797.     ROM_LOAD( "m1-prom.j5",  0x800, 0x400, 0x07678443 )
  798. ROM_END
  799.  
  800. ROM_START( vangrd2 )
  801.     ROM_REGION( 0x10000, REGION_CPU1 )
  802.     ROM_LOAD( "p1.9a",  0x0000, 0x2000, 0xbc9eeca5 )
  803.     ROM_LOAD( "p3.11a", 0x2000, 0x2000, 0x3970f69d )
  804.     ROM_LOAD( "p2.12a", 0x4000, 0x2000, 0x58b08b58 )
  805.     ROM_LOAD( "p4.14a", 0x6000, 0x2000, 0xa95f11ea )
  806.  
  807.     ROM_REGION( 0x10000, REGION_CPU2 )
  808.     ROM_LOAD( "p5.4a", 0x0000, 0x2000, 0xe4dfd0ba )
  809.     ROM_LOAD( "p6.6a", 0x2000, 0x2000, 0x894ff00d )
  810.     ROM_LOAD( "p7.7a", 0x4000, 0x2000, 0x40b4d069 )
  811.  
  812.     ROM_REGION( 0x10000, REGION_CPU3 )    /* 64k for sound code */
  813.     ROM_LOAD( "p8.6a", 0x0000, 0x2000, 0xa3daa438 )
  814.     ROM_LOAD( "p9.8a", 0x2000, 0x2000, 0x9345101a )
  815.  
  816.     ROM_REGION( 0x2000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  817.     ROM_LOAD( "p15.1e", 0x0000, 0x2000, 0x85718a41 )    /* characters */
  818.  
  819.     ROM_REGION( 0x2000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  820.     ROM_LOAD( "p13.1a", 0x0000, 0x2000, 0x912f22c6 )    /* background tiles */
  821.  
  822.     ROM_REGION( 0x2000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  823.     ROM_LOAD( "p9",     0x0000, 0x2000, 0x7aa0b684 )    /* foreground tiles */
  824.  
  825.     ROM_REGION( 0x6000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  826.     ROM_LOAD( "p12.1kl", 0x0000, 0x2000, 0x8658ea6c )    /* sprites */
  827.     ROM_LOAD( "p11.3kl", 0x2000, 0x2000, 0x620cd4ec )
  828.     ROM_LOAD( "p10.4kl", 0x4000, 0x2000, 0x5bfc04c0 )
  829.  
  830.     ROM_REGION( 0x0c00, REGION_PROMS )
  831.     ROM_LOAD( "mb7054.3j", 0x000, 0x400, 0x506f659a )
  832.     ROM_LOAD( "mb7054.4j", 0x400, 0x400, 0x222133ce )
  833.     ROM_LOAD( "mb7054.5j", 0x800, 0x400, 0x2e21a79b )
  834. ROM_END
  835.  
  836. /*******************************************************************************************/
  837.  
  838.  
  839.  
  840. static void init_marvins(void)
  841. {
  842.     init_sound( 0x40 );
  843. }
  844.  
  845. static void init_madcrash( void )
  846. {
  847. /*
  848.     The following lines patch out the ROM test (which fails - probably
  849.     because of bit rot, so the rest of the test mode (what little there
  850.     is) can be explored.
  851.  
  852.     unsigned char *mem = memory_region(REGION_CPU1);
  853.     mem[0x3a5d] = 0; mem[0x3a5e] = 0; mem[0x3a5f] = 0;
  854. */
  855.     init_sound( 0x20 );
  856.     madcrash_vreg = 0x00;
  857. }
  858.  
  859. static void init_vangrd2( void )
  860. {
  861.     init_sound( 0x20 );
  862.     madcrash_vreg = 0xf1;
  863. }
  864.  
  865.  
  866.  
  867. GAME( 1983, marvins,  0, marvins,  marvins,  marvins,  ROT270, "SNK", "Marvin's Maze" )
  868. GAMEX(1984, madcrash, 0, madcrash, madcrash, madcrash, ROT0,   "SNK", "Mad Crasher", GAME_IMPERFECT_SOUND )
  869. GAME( 1984, vangrd2,  0, madcrash, vangrd2,  vangrd2,  ROT270, "SNK", "Vanguard II" )
  870.